-- 众神之战 战斗逻辑 --
local JjcGodWarLogic = require("jjcGodWar.JjcGodWarLogic")
local JjcGodWarDB = require("jjcGodWar.JjcGodWarDB")
local CombatVideo = require("combat.CombatVideo")
local CreateRole = require("role.CreateRole")
local CombatDefine = require("combat.CombatDefine")
local HeroGrid = require("hero.HeroGrid")
local CombatLogic = require("combat.CombatLogic")
local JjcDB = require("jjc.JjcDB")
local WarReportLogic = require("warReport.WarReportLogic")
local Util = require("common.Util")

--竞猜阶段就开始生成战斗数据
function timerCombat()
	local state,round,leftTime = JjcGodWarLogic.getNowGodWarState()
	if state == JjcGodWarLogic.GODWAR_STATE_WAIT or state == JjcGodWarLogic.GODWAR_STATE_END then return end

	if round == JjcGodWarLogic.GODWAR_JIEDUAN_ZHUNBEI then return end

	local paiweiMatch,needCombat = JjcGodWarDB.getNowNeedCombat(state)
	if not paiweiMatch or not needCombat then return end

	for i=1,#needCombat do
		local pairsData = needCombat[i]
		local atkUuid = pairsData.atkUuid
		local defUuid = pairsData.defUuid
		-- local atkRoleData = JjcGodWarDB.getGodWarDataByUuid(atkUuid)
		-- local defRoleData = JjcGodWarDB.getGodWarDataByUuid(defUuid)
		
		-- require("common.Util").printTable(atkRoleData)
		-- require("common.Util").printTable(defRoleData)
		local fakeHuman = {}
		fakeHuman.db = {}
		fakeHuman.db.combatQuick = {}

	    local param = {}
	    local cbParam = {}
		cbParam.atkIndex = 1    
	    cbParam.defIndex = 1
	    cbParam.atkUuid = atkUuid
        cbParam.defUuid = defUuid
        cbParam.fenzuID = pairsData.fenzuID
        cbParam.pairsIndex = pairsData.pairsIndex
        --print("pairsIndex",pairsData.pairsIndex)
		cbParam.combatInfos = {}
		
		param.atkUuid = atkUuid
		param.defUuid = defUuid

		-- require("common.Util").printTable(atkRoleData)
		-- require("common.Util").printTable(defRoleData)
		CombatLogic.combatBegin(fakeHuman, 1001, param, CombatDefine.COMBAT_TYPE4, cbParam, true)
	end
end

function getCombatObjList(human, side, args)
	--print("getCombatObjList(human, side, args)")
	local uuid = args.atkUuid
	if CombatDefine.DEFEND_SIDE == side then
		uuid = args.defUuid
	end
	
	local data = JjcGodWarDB.getGodWarDataByUuid(uuid)
	if JjcDB.isNpc(data) then return end
	--require("common.Util").printTable(data.rolebase)
	return data.objList, data.helpList, data.rolebase, data.formation
 end 

function getCombatMonsterOutID(human, side, args)
	--print("getCombatMonsterOutID(human, side, args)")
	local uuid = args.atkUuid
	if CombatDefine.DEFEND_SIDE == side then
		uuid = args.defUuid
	end
	
	local data = JjcGodWarDB.getGodWarDataByUuid(uuid)
	--require("common.Util").printTable(data)
	if not JjcDB.isNpc(data) then return end
	--print("data.monsterOutID",data.monsterOutID)
	return data.monsterOutID,data.zhandouli
end

local function xuanbaPointCanGet(winUuid,state)
	if state == JjcGodWarLogic.GODWAR_STATE_XUANBA1 then return 20 end

	local list = JjcGodWarDB.getCombatResultListByUuid(winUuid)
	if not list then return 20 end

	local winCnt = 0
	for lastState=1,state-1 do
		if list[lastState] then
			winCnt = winCnt + 1
		else
			winCnt = 0
		end
	end

	return 20 + winCnt * 10
end

function checkHurtResult(combatInfo)
	local atkHurt = 0
	local defHurt = 0
	for pos = 1, CombatDefine.COMBAT_HERO_ALL_CNT do
		local obj = combatInfo.objList and combatInfo.objList[pos]
		if obj then
			if pos <= 10 then
				atkHurt = atkHurt + obj.result[1]
			else
				defHurt = defHurt + obj.result[1]
			end
		end
	end

	if atkHurt < defHurt then
		return true
	end
end

-- 战斗结束
function onFightEnd(human, result, type, cbParam, combatInfo)
	--print("result",result)
	--require("common.Util").printTable(cbParam)
	--require("common.Util").printTable(combatInfo)
	--print("atkFormation,defFormation,atkUuid,defUuid",combatInfo.atkFormation,combatInfo.defFormation,cbParam.atkUuid,cbParam.defUuid)
	local state,round,leftTime = JjcGodWarLogic.getNowGodWarState()
	if state == JjcGodWarLogic.GODWAR_STATE_WAIT or state == JjcGodWarLogic.GODWAR_STATE_END then return end

	if round == JjcGodWarLogic.GODWAR_JIEDUAN_ZHUNBEI then return end

	if combatInfo.result.round >= combatInfo.maxRound then
		if CombatLogic.calcWinByHurt(combatInfo) then
			combatInfo.isWin = true
			result = CombatDefine.RESULT_WIN
		else
			combatInfo.isWin = false
			result = CombatDefine.RESULT_FAIL
		end
	end
	local winUuid = nil
	if CombatDefine.RESULT_WIN == result then --atkuuid胜利
		winUuid = cbParam.atkUuid
	else --defUuid胜利
		winUuid = cbParam.defUuid
	end

	if not winUuid then return end

	--选拔赛需要累计积分 赢+20 连胜额外+10 输不掉分
	if state <= JjcGodWarLogic.GODWAR_STATE_XUANBA6 then
		local winRoleData = JjcGodWarDB.getGodWarDataByUuid(winUuid)
		if winRoleData then
			local point = xuanbaPointCanGet(winUuid,state)

			winRoleData.combatResultList = winRoleData.combatResultList or {}
			winRoleData.combatResultList[state] = {}
			winRoleData.combatResultList[state] = point --本轮战斗获得的积分记录
		end
	end

	--更新战斗配对信息
	local fenzuID = cbParam.fenzuID
	local pairsIndex = cbParam.pairsIndex

	local match = JjcGodWarDB.getMatch2Fight(state)
	match[fenzuID][pairsIndex].winUuid = winUuid
	--保存战斗记录	
	local vestID = JjcGodWarDB.addCombatRecord(cbParam,combatInfo,result)
	match[fenzuID][pairsIndex].vestID = vestID

end